/*
 * BaseServer.h
 * 
 * 服务器基类 - 框架核心
 * 提供完整的服务器框架，用户只需继承并实现业务逻辑
 * 
 * 阶段3：配置化 + BaseServer 框架
 */

#pragma once

#include "common/config/ServerConfig.h"
#include "network/NetworkServer.h"
#include "network/Session.h"
#include "protocol/MessageDispatcher.h"

#include <muduo/net/EventLoop.h>
#include <muduo/base/noncopyable.h>

#include <memory>
#include <google/protobuf/message.h>

namespace framework {

/**
 * @brief 服务器基类
 * 
 * 功能：
 * 1. 配置管理
 * 2. 网络服务器管理
 * 3. 消息分发
 * 4. 生命周期管理
 * 
 * 用户只需：
 * 1. 继承 BaseServer
 * 2. 重写 onInit() 注册消息处理器
 * 3. 实现消息处理函数
 * 4. 调用 run() 启动服务器
 */
class BaseServer : muduo::noncopyable {
public:
    explicit BaseServer(const ServerConfig& config);
    virtual ~BaseServer();
    
    /**
     * @brief 初始化服务器
     * @return 成功返回 true，失败返回 false
     */
    virtual bool init();
    
    /**
     * @brief 运行服务器（阻塞）
     * @return 退出码
     */
    int run();
    
    /**
     * @brief 停止服务器
     */
    virtual void stop();
    
    /**
     * @brief 注册消息处理器
     * @tparam T Protobuf 消息类型
     * @param msgId 消息 ID
     * @param handler 消息处理函数
     */
    template<typename T>
    void registerMessageHandler(uint16_t msgId,
                                const protocol::MessageHandler<T>& handler) {
        dispatcher_.registerHandler<T>(msgId, handler);
    }
    
    /**
     * @brief 发送消息到客户端
     * @param sessionId 会话 ID
     * @param msgId 消息 ID
     * @param msg Protobuf 消息
     */
    void sendToClient(uint64_t sessionId,
                     uint16_t msgId,
                     const google::protobuf::Message& msg);
    
    /**
     * @brief 广播消息到所有客户端
     * @param msgId 消息 ID
     * @param msg Protobuf 消息
     */
    void broadcast(uint16_t msgId,
                  const google::protobuf::Message& msg);
    
    /**
     * @brief 关闭会话
     */
    void closeSession(uint64_t sessionId);
    
    /**
     * @brief 获取会话
     */
    SessionPtr getSession(uint64_t sessionId);
    
    /**
     * @brief 获取配置
     */
    const ServerConfig& config() const { return config_; }

protected:
    /**
     * @brief 虚函数 - 子类重写
     */
    
    // 初始化时调用（注册消息处理器）
    virtual bool onInit() { return true; }
    
    // 启动后调用
    virtual void onStart() {}
    
    // 停止前调用
    virtual void onStop() {}
    
    // 会话连接时调用
    virtual void onSessionConnected(const SessionPtr& session) {}
    
    // 会话断开时调用
    virtual void onSessionDisconnected(const SessionPtr& session) {}

private:
    // 内部回调
    void handleSessionConnected(const SessionPtr& session);
    void handleSessionDisconnected(const SessionPtr& session);
    void handleSessionMessage(const SessionPtr& session,
                             muduo::net::Buffer* buf,
                             muduo::Timestamp time);
    
    ServerConfig config_;
    muduo::net::EventLoop loop_;
    std::unique_ptr<NetworkServer> networkServer_;
    protocol::MessageDispatcher dispatcher_;
    bool running_;
};

} // namespace framework

